import { useUserInfo } from '/@/stores/userInfo';
import { judementSameArr } from '/@/utils/arrayOperation';

/**
 * 单个权限验证
 * @param value 权限值
 * @returns 有权限，返回 `true`，反之则反
 */
export function auth(value: string): boolean {
	const stores = useUserInfo();
	// 转为小写后比较，实现不区分大小写的权限检查
	const lowerCaseValue = value.toLowerCase();
	return stores.userInfos.authBtnList.some((v: string) => v.toLowerCase() === lowerCaseValue);
}

/**
 * 多个权限验证，满足一个则为 true
 * @param value 权限值
 * @returns 有权限，返回 `true`，反之则反
 */
export function auths(value: Array<string>): boolean {
	let flag = false;
	const stores = useUserInfo();
	stores.userInfos.authBtnList.map((val: string) => {
		value.map((v: string) => {
			if (val === v) flag = true;
		});
	});
	return flag;
}

/**
 * 多个权限验证，全部满足则为 true
 * @param value 权限值
 * @returns 有权限，返回 `true`，反之则反
 */
export function authAll(value: Array<string>): boolean {
	const stores = useUserInfo();
	return judementSameArr(value, stores.userInfos.authBtnList);
}

/**
 * 单个角色验证
 * @param roleCode 角色代码
 * @returns 有角色，返回 `true`，反之则反
 */
export function hasRole(roleCode: string): boolean {
	const stores = useUserInfo();
	// 转为小写后比较，实现不区分大小写的角色检查
	const lowerCaseRoleCode = roleCode.toLowerCase();
	return stores.userInfos.roles.some((role: any) => role.RoleCode?.toLowerCase() === lowerCaseRoleCode);
}

/**
 * 多个角色验证，满足一个则为 true
 * @param roleCodes 角色代码数组
 * @returns 有角色，返回 `true`，反之则反
 */
export function hasAnyRole(roleCodes: Array<string>): boolean {
	const stores = useUserInfo();
	return stores.userInfos.roles.some((userRole: any) =>
		roleCodes.some((roleCode: string) => userRole.RoleCode?.toLowerCase() === roleCode.toLowerCase())
	);
}

/**
 * 多个角色验证，全部满足则为 true
 * @param roleCodes 角色代码数组
 * @returns 有角色，返回 `true`，反之则反
 */
export function hasAllRoles(roleCodes: Array<string>): boolean {
	const stores = useUserInfo();
	const userRoleCodes = stores.userInfos.roles.map((role: any) => role.RoleCode?.toLowerCase());
	const requiredRoleCodes = roleCodes.map((roleCode: string) => roleCode.toLowerCase());
	return judementSameArr(requiredRoleCodes, userRoleCodes);
}
